/*Bibliotecas Utilizadas:*/
#include <math.h>
#include <stdio.h>

/*Protótipo das funções:*/
double a(int n);
double b(int n);
double t(int n);
double p(int n);

/*
*Função recursiva que calcula a sequência 'an'.
*Parâmetro:
*	-int n: número de iterações (recursivas) do algoritmo, usadas para o cálculo da sequência an.
*Retorno:
*	-double: retorna o valor da soma parcial de 'an' para um determinado valor de n (recebido como parâmetro).
*/
double a(int n)
{
    if(n == 0)
    {
        return 1;
    }
    else
    {
        return (a(n - 1) + b(n - 1))/2;
    }
}

/*
*Função recursiva que calcula a sequência 'bn'.
*Parâmetro:
*	-int n: número de iterações (recursivas) do algoritmo, usadas para o cálculo da sequência bn.
*Retorno:
*	-double: retorna o valor da soma parcial de 'bn' para um determinado valor de n (recebido como parâmetro).
*/
double b(int n)
{
    if(n == 0)
    {
        return 1/sqrt(2);
    }
    else
    {
        return sqrt(a(n - 1) * b(n - 1));
    }
}

/*
*Função recursiva que calcula a sequência 'tn'.
*Parâmetro:
*	-int n: número de iterações (recursivas) do algoritmo, usadas para o cálculo da sequência tn.
*Retorno:
*	-double: retorna o valor da soma parcial de 'tn' para um determinado valor de n (recebido como parâmetro).
*/
double t(int n)
{
    if(n == 0)
    {
        return 0.25;
    }
    else
    {
        return t(n - 1) - p(n - 1) * pow(a(n - 1) - a(n), 2);
    }
}

/*
*Função recursiva que auxilia no cálculo da sequência 'tn', calculando o valor da sequência 'pn' utilizada no cálculo de cada 'tn'.
*Parâmetro:
*	-int n: número de iterações (recursivas) do algoritmo, usadas para o cálculo da sequência pn.
*Retorno:
*	-double: retorna o valor da soma parcial de 'pn' para um determinado valor de n (recebido como parâmetro).
*/
double p(int n)
{
    if(n == 0)
    {
        return 1;
    }
    else
    {
        return 2 * p(n - 1);
    }
}

/*Função que calcula o valor de pi a partir dos valores obtidos das somas das sequências 'an', 'bn' e 'tn' (variáveis globais).
*Parâmetro:
*	-int n: número de iterações (recursivas) do algoritmo, usadas para o cálculo do pi.
*Retorno:
*	-double: retorna o valor obtido de pi a partir dos somas das sequências 'an', 'bn' e 'tn'.
*/
double pi(int n)
{
    return pow(a(n) + b(n), 2)/(4 * t(n));
}

int gaussLegendreSeq(void){

    int n = 30; //NÚMERO DE ITERAÇÕES
 
    printf("%.6f\n", pi(n));
}
